package cate.game.play.buff.h;

import cate.common.util.XT;
import cate.game.play.buff.Buff;
import cate.game.play.buff.BuffHandler;
import cate.game.play.config.PlayCfgArgs;
import cate.game.play.proce.action.ctx.ActionCtx;

import java.util.List;
import java.util.function.Predicate;

public class 免疫指定buffBH extends BuffHandler {

	private Boolean 是否有利;

	private Boolean 是否控制;

	private List<String> 效果类型;

	private List<String> buff标签;

	//是否有利=0&是否控制=0&效果类型=嘲讽#混乱&buff标签=灼烧#冰冻&
	@Override
	public void parse(String code) {
		PlayCfgArgs args = new PlayCfgArgs(code);
		是否有利 = args.getBoolean("是否有利");
		是否控制 = args.getBoolean("是否控制");
		效果类型 = args.getStrList("效果类型");
		buff标签 = args.getStrList("buff标签");
	}


	@Override
	public void onAdd(ActionCtx action) {
		this.buff.owner.buff.removeBuff(action, buildPredicate());
	}

	@Override
	public boolean allowAddBuff(ActionCtx action, Buff buffToAdd) {
		if (buildPredicate().test(buffToAdd)) {
			return false;
		}
		return true;
	}

	private Predicate<Buff> predicate;

	private Predicate<Buff> buildPredicate() {
		if (predicate == null) {
			predicate = b -> {
				if (是否有利 != null && 是否有利 != b.isGood()) {
					return false;
				}
				if (是否控制 != null && 是否控制 != b.isCtrl()) {
					return false;
				}
				if (XT.isNotBlank(效果类型) && !效果类型.contains(b.cfg.row.effectType)) {
					return false;
				}
				if (XT.isNotBlank(buff标签) && !b.cfg.containTags(buff标签)) {
					return false;
				}
				return true;
			};
		}
		return predicate;
	}
}
